package com.sptus.web.util;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Objects;

public class DateTimeUtils {

    private static final DateTimeFormatter FORMATTER = 
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 替换日期但保持时间不变（字符串版本）
     * @param originalDateTimeStr 原始日期时间字符串（格式：yyyy-MM-dd HH:mm:ss）
     * @param targetDateStr 目标日期字符串（格式：yyyy-MM-dd）
     * @return 新日期时间字符串（格式：yyyy-MM-dd HH:mm:ss）
     * @throws DateTimeParseException 如果格式解析失败
     * @throws NullPointerException 如果参数为null
     */
    public static String replaceDate(String originalDateTimeStr, String targetDateStr) {
        Objects.requireNonNull(originalDateTimeStr, "原始日期时间不能为空");
        Objects.requireNonNull(targetDateStr, "目标日期不能为空");

        // 解析输入参数
        LocalDateTime originalDateTime = parseDateTime(originalDateTimeStr);
        LocalDate targetDate = parseDate(targetDateStr);

        // 执行日期替换
        LocalDateTime newDateTime = LocalDateTime.of(
            targetDate, 
            originalDateTime.toLocalTime()
        );

        // 格式化为字符串
        return FORMATTER.format(newDateTime);
    }

    /**
     * 替换日期但保持时间不变（对象版本）
     * @param originalDateTime 原始日期时间对象
     * @param targetDate 目标日期对象
     * @return 新日期时间字符串（格式：yyyy-MM-dd HH:mm:ss）
     */
    public static String replaceDate(LocalDateTime originalDateTime, LocalDate targetDate) {
        Objects.requireNonNull(originalDateTime, "原始日期时间不能为空");
        Objects.requireNonNull(targetDate, "目标日期不能为空");
        
        return FORMATTER.format(
            LocalDateTime.of(targetDate, originalDateTime.toLocalTime())
        );
    }

    // 解析日期时间字符串
    private static LocalDateTime parseDateTime(String str) {
        try {
            return LocalDateTime.parse(str, FORMATTER);
        } catch (DateTimeParseException e) {
            throw new DateTimeParseException("日期时间格式错误，预期格式：yyyy-MM-dd HH:mm:ss", str, 0);
        }
    }

    // 解析日期字符串
    private static LocalDate parseDate(String str) {
        try {
            return LocalDate.parse(str);
        } catch (DateTimeParseException e) {
            throw new DateTimeParseException("日期格式错误，预期格式：yyyy-MM-dd", str, 0);
        }
    }


}